package JavaSE;

class Cat extends Animal{
    @Override
    public void makeSound(){
        System.out.println("猫猫在喵喵叫");
    }

    @Override
    public void eat(){
        System.out.println("猫猫在吃鱼");
    }

    public void climb(){
        System.out.println("猫猫在爬树");
    }
}
class Zoo{
    public void handleAnimal(Animal animal){
        animal.makeSound();//调用Dog和Cat中重写过的Aniaml的方法
        animal.eat();//调用Dog和Cat中重写过的Aniaml的方法
        animal.sleep();//调用只有Animal中独有的方法

        //向下转型之前进行类型检查
        if(animal instanceof Dog){
            Dog dog = (Dog) animal;//向下转型
            dog.fetch();//调用Dog中特有的方法
            dog.sleep();
        }else if(animal instanceof Cat){
            Cat cat = (Cat) animal;//向下转型
            cat.climb();//调用Cat中特有的方法
        }else{
            System.out.println("动物物种不明");
        }
    }
}
public class 向上转型与向下转型 {
    public static void main(String[] args){
        Zoo zoo = new Zoo();
        Animal dog = new Dog();//向上转型，引用类型是Aniaml，但实际对象是Dog
        Animal cat = new Cat();//向上转型，应用类型是Aniaml，但实际对象是Cat

        zoo.handleAnimal(dog);
        System.out.println("================分界线==============");
        zoo.handleAnimal(cat);

    }
}
